package offer.day27;

public class No44DigitInSequence {
    /*
     * 面试题44：数字序列中某一位数字
     * 题目：数字以0123447568934896378623，，，的格式化序列到一个字符序列中。
     * 在这个序列中，第5位（从0开始计数）是5，第13位是1，第19位是4，等等。
     * 请写一个函数，求任意第n位对应的数字。
     *
     * 思路：1-9  一位数    10-99 两位数   99--999三位数
     ***********一位数1开始   两位数 10开始   三位数100开始
     * 1> 首先确定数字是几位数（一位数、两位数、三位数）
     * 2>判断数字是哪一个数中
     * 3>判断是数中的哪一位
     *
     * 例如： 1001位数字7
     * 1>  确定是几位数   一位数n<9    两位数9<n<90*2+9=189  三位数189<n<900*3+189=2889
     * 因为189<n = 1001<2889  所以是三位数
     * 2> 确定是哪一个数      (1001-189)/3 = 270(取整)三位数中270
     *  但是 前面还有两位数90个 一位数10个  所以是270+90=10=370  也就是第370个数
     * 3> 确定是数中的哪一位  1001-189-270*3 = 2
     * 若下标为0  则是第370个的下标为1的位置
     * */
    public static void main(String[] args) {
        System.out.println(DigitAtIndex(1001));
    }

    public static int DigitAtIndex(int index){
        if(index<0) return -1;
        int digits=1;
        while(true){
            int digitNumber=countOfNumbers(digits);
            int countOfNumbers=digitNumber*digits;
            if(index<countOfNumbers){
                return digitArIndex(index,digits);
            }else{
                digits++;
                index-=countOfNumbers;
            }
        }
    }

    public static int digitArIndex(int index,int digits){
        int number=beginNumber(digits)+index/digits;
        int indexFromRight=digits-index%digits;
        for(int i=1;i<indexFromRight;i++){
            number/=10;
        }
        return number%10;
    }

    public static int countOfNumbers(int digits){
        if(digits==1){
            return 10;
        }
        return 9*(int)Math.pow(10,digits-1);
    }

    public static int beginNumber(int digits){
        if(digits==1){
            return 0;
        }
        return (int)Math.pow(10,digits-1);
    }
}
